package com.ccp.dev.workflow.dao;

import com.ccp.dev.core.basic.base.IBaseMapper;
import com.ccp.dev.core.basic.web.query.QueryFilter;
import com.ccp.dev.workflow.model.bpm.ProcessTask;
import org.apache.ibatis.annotations.Param;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 流程任务dao
 * @author jia
 */
public interface TaskDao extends IBaseMapper<ProcessTask, String> {

    /**
     * 生成任务
     *
     * @param newTask
     */
    void insertTask(ProcessTask newTask);

    /**
     * 在act_ru_identitylink插入一条用户数据
     * @param id 新纪录id主键
     * @param userId 用户id
     * @param taskId 任务id
     */
    void insertIdentity(@Param("id") String id,@Param("taskId") String taskId,@Param("userId") String userId);

    /**
     * 根据任务id删除任务。
     * @param id
     */
    void delRuTaskByTaskId(String id);

    /**
     * 根据流程实例ID删除任务候选人。
     *
     * @param procInstId
     */
    void delCandidateByInstanceId(String procInstId);

    /**
     * 根据流程实例删除任务。
     *
     * @param procInstId
     */
    void delByInstanceId(String procInstId);

    /**
     * 删除某任务的沟通任务
     *
     * @param parentTaskId
     */
    void delCommuTaskByParentTaskId(String parentTaskId);

    /**
     * 根据流程实例id删除沟通任务的子任务
     * @param processInstanceId 流程实例id
     */
    void delSubCustTaskByInstId(String processInstanceId);

    /**
     * 级联删除，解决ACT_RU_TASK的主键ID是act_Ru_Identitylink表外键的约束
     * @param id
     */
    void delActRuIdentitylink(String id);

    /**
     * 根据任务id和用户id删除act_ru_identitylink表中记录
     * @param taskId
     * @param userId
     */
    void delActRuIdentitylinkByTaskAndUser(@Param("taskId") String taskId,@Param("userId") String userId);

    /**
     * 删除某节点某人的沟通任务
     * @param instInstId
     * @param nodeId
     * @param userId
     */
    void delCommuTaskByInstNodeUser(@Param("instInstId") String instInstId,@Param("nodeId") String nodeId,@Param("userId") String userId);

    /**
     * 删除指定parentTaskId的流转任务
     * @param parentTaskId
     */
    void delTransToTaskByParentTaskId(String parentTaskId);

    /**
     * 修改任务的优先级
     * @param taskId
     * @param level
     */
    void updateTaskPriority(@Param("taskId") String taskId, @Param("level") int level);

    /**
     * 修改任务的executionId
     * @param executionId
     * @param taskId
     */
    void updTaskExecution(@Param("executionId") String executionId,@Param("taskId") String taskId);

    void updateOldTaskDefKeyByInstIdNodeId(Map map);

    /**
     * 更新任务的执行人
     *
     * @param taskId
     * @param userId
     */
    void updateTaskAssignee(@Param("taskId") String taskId, @Param("userId") String userId);

    /**
     * 更新任务
     * @param params
     */
    void updateTask(Map<String, Object> params);

    /**
     * 更新任务描述
     * @param description 任务描述
     * @param taskId 任务id
     */
    void updateTaskDescription(@Param("description") String description,@Param("taskId") String taskId);

    /**
     * 获取我的任务
     *
     * @return
     */
    List<ProcessTask> queryMyTask(QueryFilter queryFilter);

    /**
     * 获取我的所有任务
     *
     * @return
     */
    List<String> queryAllTaskOfMe(String userId);

    /**
     * 获取只有我能审批的所有任务
     * @return
     */
    List<ProcessTask> queryTaskOnlyOfMe(QueryFilter queryFilter);

    /**
     * 查询我的任务是否有其他的审批人，并计数返回
     * @param taskId 任务id
     * @param userId 用户id
     * @return 记录条数
     */
    Integer queryOtherApproverCountOfMyTask(@Param("taskId") String taskId, @Param("userId") String userId);

    /**
     * 判断用户是否有权限访问某个任务。
     *
     * @param taskId 任务id
     * @param userId 用户id
     * @return 记录条数
     */
    Integer getHasRightsByTask(@Param("taskId") String taskId, @Param("userId") String userId);

    /**
     * 根据流程实例ID获取数据。
     *
     * @param procInstId
     * @return
     */
    List<ProcessTask> getTaskByInstId(String procInstId);

    /**
     * 获取所有状态的加签任务
     *
     * @param parentTaskId
     * @return
     */
    List<ProcessTask> getByParentTaskId(String parentTaskId);

    /**
     * 根据流程实例ID获取任务
     * @param instanceId 流程实例id
     * @return 任务列表
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    List<ProcessTask> getByInstanceId(String instanceId);


    /**   姚陆洋
     * 根据taskId 返回任务实体
     * @param taskId
     * @return
     */
    ProcessTask getByTaskId(String taskId);

    /**
     * 获取某节点某人的沟通任务
     * @param instInstId
     * @param nodeId
     * @param userId
     */
    String getCommuTaskByInstNodeUser(@Param("instInstId") String instInstId,@Param("nodeId") String nodeId,@Param("userId") String userId);

    /**
     * 按parentTaskId和description返回任务实体
     * @param parentTaskId
     * @param description
     * @return
     */
    List<TaskEntity> queryByParentTaskIdAndDesc(@Param("parentTaskId") String parentTaskId,@Param("description") String description);

    /**
     * 根据parentTaskId和userId查找
     * @param parentTaskId
     * @param userId
     * @return
     */
    ProcessTask getTaskByParentIdAndUser(@Param("parentTaskId") String parentTaskId, @Param("userId") String userId);

    /**
     * 取得未到期的任务
     * @return
     */
    List<ProcessTask> queryReminderTask();

}
